#!/bin/bash

grupo="%%GRUPO%%"

config_file="${grupo}/conf/Instula.conf"
installation_ok=1

# Funciones 

# Chequea que todos los componentes esten correctamente instalados
# En caso de que así sea, se setea la variable installation_ok en 1, caso contratio en 0
# También quedará a disposición el motivo de la falla en error_reason.

# Este chequeo se hace antes de cargar los valores para las variables de ambiente
installationFirstCheck() {

    if [ "$grupo" = "" ]
    then
        installation_ok=0
        error_reason="Falta especificar el directorio raíz."
        onError
    fi

    required_dirs=(
        "$grupo"
        "$grupo/conf"
        "$grupo/inst"
        "$grupo/data"
        "$grupo/recibidos"
        "$grupo/rechazados"
        "$grupo/nuevos"
        "$grupo/list"
    )

    required_files=(
        "$grupo/conf/Instula.conf"
        "$grupo/data/agencias.mae"
        "$grupo/data/beneficios.mae"
    )

    for (( i=0; i<${#required_dirs[@]}; i++ )); do
        if [ ! -d "${required_dirs[${i}]}" ]
        then
            installation_ok=0
            error_reason="${required_dirs[${i}]} no es un directorio válido o no existe."
            onError
        fi
    done

    for (( i=0; i<${#required_files[@]}; i++ )); do
        if [ ! -f "${required_files[${i}]}" ]
        then
            installation_ok=0
            error_reason="${required_files[${i}]} no es un archivo válido o no existe."
            onError
        fi
    done
}

# Chequea que todos los componentes esten correctamente instalados
# En caso de que así sea, se setea la variable installation_ok en 1, caso contratio en 0
# También quedará a disposición el motivo de la falla en error_reason.

# Este chequeo se hace despues de cargar los valores para las variables de ambiente
installationFinalCheck() {
    required_dirs=(
        "$BINDIR"
        "$ARRIDIR"
        "$LOGDIR"
        "$CONFDIR"
    )

    required_files=(
        "$BINDIR/postonio.sh"
        "$BINDIR/postular.sh"
        "$BINDIR/plist.pl"
        "$BINDIR/mover.sh"
        "$BINDIR/gralog.sh"
    )

    required_env_vars=(
        "DATASIZE"
        "LOGEXT"
        "MAXLOGSIZE"
        "USERID"
        "datetime"
    )

    for (( i=0; i<${#required_dirs[@]}; i++ )); do
        if [ ! -d "${required_dirs[${i}]}" ]
        then
            installation_ok=0
            error_reason="${required_dirs[${i}]} no es un directorio válido o no existe."
            onError
        fi
    done

    for (( i=0; i<${#required_files[@]}; i++ )); do
        if [ ! -f "${required_files[${i}]}" ]
        then
            installation_ok=0
            error_reason="${required_files[${i}]} no es un archivo válido o no existe."
            onError
        fi
    done

    for (( i=0; i<${#required_env_vars[@]}; i++ )); do
        if [ "`eval "echo \$${#required_env_vars[@]}"`" = "" ]
        then
            installation_ok=0
            error_reason="La variable ${required_env_vars[${i}]} tiene un contenido inválido o no se encuentra asignada."
            onError
        fi
    done
}

onError() {
    export installation_ok
    echo "Inicialización de Ambiente No fue exitosa. Error: $error_reason"
    exit 1
}

setEnvironmentVariables() {
	export grupo
	export POSTINI_EXECUTED=true
}

showEnvironmentVariables() {
	echo "===================================="
	echo "VARIABLES DE AMBIENTE"
	echo "===================================="
	echo "CURRDIR=$grupo"
	echo "CONFDIR=$CONFDIR"	
	echo "ARRIDIR=$ARRIDIR"	
	echo "BINDIR=$BINDIR"	
	echo "DATASIZE=$DATASIZE"	
	echo "LOGDIR=$LOGDIR"	
	echo "LOGEXT=$LOGEXT"	
	echo "MAXLOGSIZE=$LOGSIZE"	
}

checkPostiniExecuted() {
	if [ "$POSTINI_EXECUTED" = "true" ]
	then
		echo "POSTINI ya fue ejecutado previamente. No se han realizado cambios."
		showEnvironmentVariables
		exit 1
	fi

}

setPATHEnvironmentVariable() {
    added=`echo $PATH | grep -c $BINDIR`
    # control de si ya fue agregado, se considera el mismo directorio donde se encuentra el postini como directorio
    # donde estan todos los binarios
    if [ $added -eq 0 ]; then
        export PATH="$PATH:$BINDIR"     
    fi
}

loadVariables(){
    # Busco en instula.conf los directorios elegidos por el usuario
    
    while read line
    do
	vars=( $line )
	# Cargo las variables necesarias
        if [ "${vars[0]}" = "CURRDIR" ]
     	then
		    CURRDIR=${vars[2]}
		    export CURRDIR
	fi
     	if [ "${vars[0]}" = "CONFDIR" ]
     	then
		    CONFDIR=${vars[2]}
		    export CONFDIR
	fi
	if [ "${vars[0]}" = "ARRIDIR" ]
     	then
		    ARRIDIR=${vars[2]}
		    export ARRIDIR
	fi
	if [ "${vars[0]}" = "BINDIR" ]
     	then
		    BINDIR=${vars[2]}
		    export BINDIR
	fi
        if [ "${vars[0]}" = "DATASIZE" ]
     	then
		    DATASIZE=${vars[2]}
		    export DATASIZE
	fi
     	if [ "${vars[0]}" = "LOGDIR" ]
     	then
		    LOGDIR=${vars[2]}
		    export LOGDIR
	fi
	if [ "${vars[0]}" = "LOGEXT" ]
     	then
		    LOGEXT=${vars[2]}
		    export LOGEXT
	fi
	if [ "${vars[0]}" = "MAXLOGSIZE" ]
     	then
		    LOGSIZE=${vars[2]}
		    export LOGSIZE
	fi
	if [ "${vars[0]}" = "FECINS" ]
     	then
		    datetime=${vars[2]}
		    export datetime
	fi
    done < $config_file
}

endingMessage() {
    export installation_ok
    echo "Inicialización de Ambiente Concluida"
    showEnvironmentVariables
    echo "Demonio corriendo bajo el Nro.: $!"
}
			
runPostonio(){

# me fijo si no esta corriendo postonio y sino lo ejecuto
proc_count=`ps ax | grep -v grep | grep postonio | wc -l`

if [ $proc_count -ge 1 ];
then
	#esta corriendo, mando el error
	s=`ps ax | grep -v grep | grep postonio`
 	pid=( $s )
	error_reason="postonio ya se esta ejecutando bajo el pid ${pid[0]}"
	onError
else
	#no esta corriendo, entonces lo ejecuto
    export installation_ok
	postonio.sh &
fi

}


# main
checkPostiniExecuted
installationFirstCheck
loadVariables
installationFinalCheck
setEnvironmentVariables
setPATHEnvironmentVariable
runPostonio
endingMessage
